#include "EventLoopThread.h"
#include "EventLoop.h"

EventLoopThread::EventLoopThread(const ThreadInitCallback &cb, const std::string &name)
    : loop_(nullptr) // loop暂未创建
    , exiting_(false)
      /**
       * EventLoopThread中的线程，该线程创建自己的subloop
       * 但这里只是先注册了其线程函。Thread::start才会真正创建线程并执行该线程函数
       */
    , thread_(std::bind(&EventLoopThread::threadFunc, this), name)
    , mutex_()
    , cond_()
    , callback_(cb)
{
}

EventLoopThread::~EventLoopThread()
{
    exiting_ = true;
    if (loop_ != nullptr)
    {
        loop_->quit();
        thread_.join();
    }
}

EventLoop *EventLoopThread::startLoop()
{
    thread_.start(); // 这里，EventLoopThread中的线程才真正被创建，并执行下面的threadFunc()

    EventLoop *loop = nullptr;
    {
        std::unique_lock<std::mutex> lock(mutex_);
        while (loop_ == nullptr) // 如果EventLoopThread线程还未完成subloop的创建，就在条件变量处等待
        {
            cond_.wait(lock);
        }
        loop = loop_;
    }
    return loop;
}

// 在新创建的EventLoopThread中执行
void EventLoopThread::threadFunc()
{
    // EventThread中的EventLoop。创建subloop 和上面的线程是一一对应的，one loop per thread
    EventLoop loop;

    if (callback_)
    {
        callback_(&loop); // 对EventLoopThread创建的EventLoop进行初始化
    }

    {
        std::unique_lock<std::mutex> lock(mutex_);
        loop_ = &loop;      // 创建完成
        cond_.notify_one(); // 唤醒在条件变量等待的线程
    }

    loop.loop(); // 启动subloop，subloop中的poller启动poll
    std::unique_lock<std::mutex> lock(mutex_);
    loop_ = nullptr;
}